package Aula12;

public class ListaSimples implements Lista{
	
	private No cabeca;
	private No cauda;
	private int tamanho;
	
	public ListaSimples(){
		cabeca = null;
		cauda = null;
		tamanho = 0;
	}
	
	public Object getCabeca() {
		return cabeca.getChave();
	}

	public Object getCauda() {
		return cauda.getChave();
	}

	public void add(Object o){
		No no = new No(o);
		if(cabeca == null){
			cabeca = no;
			cauda = no;
		}else{
			cauda.setProximo(no);
			no.setAnterior(cauda);
			cauda = no;
		}
		tamanho++;
	}
	
	public void addCabeca(Object o){
		No no = new No(o);
		if(cabeca == null){
			cabeca = no;
			cauda = no;
		}else{
			no.setProximo(cabeca);
			cabeca.setAnterior(no);
			cabeca = no;
		}
		tamanho++;
	}
	
	public void remove(Object o){
		No atual = cabeca;
		while(atual != null){
			if(atual.getChave().equals(o)){
				if(atual.equals(cabeca)){
					cabeca = cabeca.getProximo();
					if(cabeca != null){
						cabeca.setAnterior(null);
					}
				}else if(atual.equals(cauda)){
					cauda = cauda.getAnterior();
					cauda.setProximo(null);
				}else{
					atual.getAnterior().setProximo(atual.getProximo());
					atual.getProximo().setAnterior(atual.getAnterior());
				}
				tamanho--;
				return;
			}
			atual = atual.getProximo();
		}
	}
	
	public Object get(int i){
		if(i <= tamanho - 1 && i >= 0){
			No no = cabeca;
			while(i != 0){
				no = no.getProximo();
				i--;
			}
			return no.getChave();
		}
		throw new RuntimeException("Index Invalid");
	}
	
	public int size(){
		return tamanho;
	}
	
	public boolean contains(No no){
		No atual = cabeca;
		while(atual != null){
			if(atual.equals(no)){
				return true;
			}
			atual = atual.getProximo();
		}
		return false;
	}
	
	public boolean contains(Object o){
		return contains(new No(o));
	}
	
	public String toString() {
		String str = "";
		String separador = ",";
		No no = cabeca;
		while(no != null){
			if(no.equals(cauda)){
				separador = "";
			}
			str += no.toString() + separador;
			no = no.getProximo();
		}
		return str;
	}

	public String ImprimeListaPecas() {
		return toString();
	}
}
